package com.cman777.springc.redis.annotation;



import com.cman777.springc.common.bean.Iface.EntityIFace;

import java.lang.annotation.*;

/**
 * @author chenzhicong
 * @time 2019/11/10 15:14
 * @description 用于添加分布式锁
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Documented
@Repeatable(value = RedisLock.List.class)
public @interface RedisLock {

    /**
     * 前缀，因为一般是针对某个实体表的粒度，
     * 所以可以直接传入实体class，加锁的时候前缀为实体类名
     * @return
     */
    Class<? extends EntityIFace> entity() default EntityIFace.class;

    /**
     * 支持 spel 表达式
     * 盐
     * @return
     */
    String salt() default "'0'";

    /**
     * redis key的固定的前缀,如果有值将覆盖entity的值
     */
    String fixedPrefix() default "";

    /**
     * 获取锁，等待时间。单位秒
     * @return
     */
    long waitTime() default 5;

    /**
     * 锁的自动释放时间，单位秒,会自动续约
     * @return
     */
    long leaseTime() default 60;

    /**
     * 拒绝策略，默认true，表示
     * @return
     */
    boolean rejectStrategy() default true;

    /**
     * 允许一个方法上同时放多个同样的注解
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.METHOD})
    @Documented
    @interface List {
        RedisLock[] value();
    }


}
